#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>

int main() {
    // 创建或确保文件存在
    int fd = open("./ipc_file", O_CREAT | O_RDWR, 0644);
    if (fd == -1) {
        perror("open file");
        return 1;
    }
    close(fd);
    
    // 不同的ftok设置方式
    key_t key1 = ftok(".", 'a');           // 使用当前目录
    key_t key2 = ftok("./ipc_file", 'b');  // 使用特定文件
    key_t key3 = ftok("/tmp", 'c');        // 使用系统目录
    
    std::cout << "Key1 (., 'a'): " << key1 << std::endl;
    std::cout << "Key2 (./ipc_file, 'b'): " << key2 << std::endl;
    std::cout << "Key3 (/tmp, 'c'): " << key3 << std::endl;
    
    // 检查ftok是否成功
    if (key1 == -1 || key2 == -1 || key3 == -1) {
        perror("ftok failed");
        return 1;
    }
    
    // 使用key创建消息队列
    int msgid = msgget(key1, IPC_CREAT | 0644);
    if (msgid == -1) {
        perror("msgget failed");
        return 1;
    }
    
    std::cout << "Message queue created with ID: " << msgid << std::endl;
    
    // 清理
    msgctl(msgid, IPC_RMID, NULL);
    unlink("./ipc_file");
    
    return 0;
} 